package com.wl.dzt.sys.core.dao.select;

import com.wl.dzt.sys.core.dao.select.order.Sort;
import com.wl.dzt.sys.core.dao.select.term.Term;

import java.util.List;
import java.util.Set;


/**
 * @author wl_code@163.com
 * @version 1.0
 * @date 2018/7/5/005
 * @description 查询sql构建接口
 * 根据数据库类型的不同进行不同sql语句元素的解析
 */
public interface SelectSqlBuilder {

    /**
     * <b>初始化 </b>
     * <p>
     * 初始化
     * </p>
     *
     * @param selectMate
     * @param select
     */
    void init(SelectMate selectMate, Select select);

    /**
     * <b>构建排序</b>
     * <p>
     * 构建排序
     * </p>
     *
     * @param selectMate
     * @param clazz
     * @param sorts
     */
    void builderOrder(SelectMate selectMate, Class<?> clazz, List<Sort> sorts);

    /**
     * <b>构建分页</b>
     * <p>
     * 构建分页
     * </p>
     *
     * @param selectMate
     * @param start
     * @param limit
     */
    void builderPage(SelectMate selectMate, Integer start, Integer limit);

    /**
     * <b>构建查询条件 </b>
     * <p>
     * 构建查询条件
     * </p>
     *
     * @param selectMate
     * @param clazz
     * @param terms
     */
    void builderWhere(SelectMate selectMate, Class<?> clazz, List<Term> terms);

    /**
     * <b> 构建字段</b>
     * <p>
     * 构建字段
     * </p>
     *
     * @param selectMate
     * @param clazz
     * @param fields
     */
    void builderFields(SelectMate selectMate, Class<?> clazz, Set<String> fields);

    /**
     * <b>构建引用</b>
     * <p>
     * 构建引用
     * </p>
     *
     * @param selectMate
     * @param clazz
     */
    void buiderRef(SelectMate selectMate, Class<?> clazz);

    /**
     * <b> 组装 </b>
     * <p>
     * 组装
     * </p>
     *
     * @param select
     * @return
     */
    SelectMate assembleAll(Select select);
}
